home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Spanish Scene 1
/
SpanishScene1.iso
/
spanish pack n°1 by llfb
/
--llfb--
/
programas
/
sources1.dms
/
sources1.adf
/
SOURCES
/
Rutinas_de_lineas
/
TIP_DrawLine.ASM
< prev
Wrap
Assembly Source File
|
1996-06-04
|
4KB
|
126 lines
*******************************************************************************
* *
* 'DrawLine V1.01' By TIP/SPREADPOINT *
* *
* *
*******************************************************************************
DL_Width = 40
DL_Fill = 0 ; 0=NOFILL / 1=FILL
IFEQ DL_Fill
DL_MInterns = $CA
ELSE
DL_MInterns = $4A
ENDC
;
; A0 = PlanePtr, A6 = $DFF002, D0/D1 = X0/Y0, D2/D3 = X1/Y1
; D4 = PlaneWidth > Kills: D0-D4/A0-A1 (+D5 in Fill Mode)
DrawLine: cmp.w d1,d3 ; Drawing only from Top to Bottom is
bge.s .y1ly2 ; necessary for:
exg d0,d2 ; 1) Up-down Differences (same coords)
exg d1,d3 ; 2) Blitter Invert Bit (only at top of
; line)
.y1ly2: sub.w d1,d3 ; D3 = yd
; Here we could do an Optimization with Special Shifts
; depending on the DL_Width value... I know it, but please, let it be.
mulu d4,d1 ; Use muls for neg Y-Vals
add.l d1,a0 ; Please don't use add.w here !!!
moveq #0,d1 ; D1 = Quant-Counter
sub.w d0,d2 ; D2 = xd
bge.s .xdpos
addq.w #2,d1 ; Set Bit 1 of Quant-Counter (here it
; could be a moveq)
neg.w d2
.xdpos: moveq #$f,d4 ; D4 full cleaned (for later oktants
; move.b)
and.w d0,d4
IFNE DL_Fill
move.b d4,d5 ; D5 = Special Fill Bit
not.b d5
ENDC
lsr.w #3,d0 ; Yeah, on byte (necessary for bchg)...
add.w d0,a0 ; ...Blitter ands automagically
ror.w #4,d4 ; D4 = Shift
or.w #$B00+DL_MInterns,d4 ; BLTCON0-codes
swap d4
cmp.w d2,d3 ; Which Delta is the Biggest ?
bge.s .dygdx
addq.w #1,d1 ; Set Bit 0 of Quant-Counter
exg d2,d3 ; Exchange xd with yd
.dygdx: add.w d2,d2 ; D2 = xd*2
move.w d2,d0 ; D0 = Save for $52(a6)
sub.w d3,d0 ; D0 = xd*2-yd
addx.w d1,d1 ; Bit0 = Sign-Bit
move.b Oktants(PC,d1.w),d4 ; In Low Byte of d4
; (upper byte cleaned above)
swap d2
move.w d0,d2
sub.w d3,d2 ; D2 = 2*(xd-yd)
moveq #6,d1 ; D1 = ShiftVal (not necessary)
; + TestVal for the Blitter
lsl.w d1,d3 ; D3 = BLTSIZE
add.w #$42,d3
lea $52-2(a6),a1 ; A1 = CUSTOM+$52
; WARNING : If you use FastMem and an extreme DMA-Access (e.g. 6
; Planes and Copper), you should Insert a tst.b (a6) here (for the
; shitty AGNUS-BUG)
.wb: btst d1,(a6) ; Waiting for the Blitter...
bne.s .wb
IFNE DL_Fill
bchg d5,(a0) ; Inverting the First Bit of Line
ENDC
;-------------- Not necessary, only for testing purposes ! (Cf Init Part...)
; move.w #$8000,$74-2(a6)
; move.w #-1,$44-2(a6)
; move.w #-1,$72-2(a6)
; move.w #DL_Width,$60-2(a6)
; move.w #DL_Width,$66-2(a6)
;--------------
move.l d4,$40-2(a6) ; Writing to the Blitter Regs as fast
move.l d2,$62-2(a6) ; as possible
move.l a0,$48-2(a6)
move.w d0,(a1)+
move.l a0,(a1)+ ; Shit-Word Buffer Ptr...
move.w d3,(a1)
rts
;
IFNE DL_Fill
SML = 2
ELSE
SML = 0
ENDC
Oktants: dc.b SML+1,SML+1+$40
dc.b SML+17,SML+17+$40
dc.b SML+9,SML+9+$40
dc.b SML+21,SML+21+$40
;
; Optimized Init Part... A6 = $DFF000 > Kills : D0-D2
DL_Init: addq.w #2,a6 ; A6 = $DFF002 for DrawLine !
moveq #-1,d1
IFGT DL_Width-127
move.w #DL_Width,d0
ELSE
moveq #DL_Width,d0
ENDC
moveq #6,d2
.wb: btst d2,(a6)
bne.s .wb
move.w d1,$44-2(a6)
move.w d1,$72-2(a6)
move.w #$8000,$74-2(a6)
move.w d0,$60-2(a6)
move.w d0,$66-2(a6)
rts
DL_Exit: subq.w #2,a6 ; A6 = $DFF000
rts